<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <p data-lake-id="uc807e096" id="uc807e096"><span data-lake-id="u15883b9a" id="u15883b9a">​</span><br></p>
  <p data-lake-id="u902259ae" id="u902259ae"><span data-lake-id="u2722131d" id="u2722131d">Java中Stop-The-World机制简称STW，是在执行垃圾收集算法时，Java应用程序的其他所有线程都被挂起。这是Java中一种全局暂停现象，全局停顿，所有Java代码停止，native代码可以执行，但不能与JVM交互。</span></p>
  <p data-lake-id="u2ae880ef" id="u2ae880ef"><span data-lake-id="ud01124ee" id="ud01124ee">​</span><br></p>
  <p data-lake-id="u7437a3ea" id="u7437a3ea"><span data-lake-id="u6c6e1dda" id="u6c6e1dda">不管选择哪种GC算法，stop-the-world都是不能彻底避免的，只能尽量降低STW的时长。</span></p>
  <p data-lake-id="u7234b10b" id="u7234b10b"><span data-lake-id="u2eacabf1" id="u2eacabf1">​</span><br></p>
  <p data-lake-id="u2ec3b48c" id="u2ec3b48c"><span data-lake-id="u31fc2426" id="u31fc2426">为什么需要STW呢？</span></p>
  <p data-lake-id="u1fe56bd6" id="u1fe56bd6"><span data-lake-id="u3a523a56" id="u3a523a56">​</span><br></p>
  <p data-lake-id="u5e89dc6d" id="u5e89dc6d"><span data-lake-id="u29a69877" id="u29a69877">首先，如果不暂停用户线程，就意味着期间会不断有垃圾产生，永远也清理不干净。</span></p>
  <p data-lake-id="ubc9eb160" id="ubc9eb160"><span data-lake-id="u749b82b8" id="u749b82b8"><br></span><span data-lake-id="u23dfa8be" id="u23dfa8be">其次，用户线程的运行必然会导致对象的引用关系发生改变，这就会导致两种情况：漏标和多标。</span></p>
  <p data-lake-id="u706d25e3" id="u706d25e3"><span data-lake-id="u5cff2fa3" id="u5cff2fa3">​</span><br></p>
  <p data-lake-id="u0c297507" id="u0c297507"><span data-lake-id="u79dbb218" id="u79dbb218">多标：其实就是这个对象原本应该被回收掉的垃圾对象，但是被错误的标记成了存活对象。从而导致这个对象没有被GC回收掉。&nbsp;这种情况还好一点，无非就是产生了一些浮动垃圾，下次GC再清理就好了。</span></p>
  <p data-lake-id="udfb87354" id="udfb87354"><span data-lake-id="ue197d1c0" id="ue197d1c0">​</span><br></p>
  <blockquote data-lake-id="ua4dd1414" id="ua4dd1414">
   <p data-lake-id="u1b6fe0fe" id="u1b6fe0fe"><span data-lake-id="u24cf94e2" id="u24cf94e2">垃圾收集在标记的过程中，其实标记的并不是垃圾对象，而是通过可达性分析标记可达对象。所以当一个对象本来是垃圾对象（不可达对象），但是错误的标记成非垃圾对象（可达对象）时，就是</span><strong><span data-lake-id="u7a7490bb" id="u7a7490bb">多标</span></strong><span data-lake-id="u09f3e089" id="u09f3e089">了。就会导致浮动垃圾。</span></p>
  </blockquote>
  <p data-lake-id="ue5ad790e" id="ue5ad790e"><span data-lake-id="u23dd344d" id="u23dd344d">​</span><br></p>
  <p data-lake-id="u50b10fad" id="u50b10fad"><span data-lake-id="u7d42689c" id="u7d42689c">漏标：一个对象本来应该是存活对象，但是没有被正确的标记上，导致被错误的垃圾回收掉了。</span></p>
 </body>
</html>